<?php 
/**
 * VJson.php
 * 
 * @author mw
 *
 */
/**
 * VJson
 * 
 * @author mw
 * @package View
 *
 */
class VJson extends VView {
	/**
	 *  Costruttore
	 */
	public function __construct() {
		parent::__construct();
	}
	/**
	 * __call
	 * 
	 * Workaround per l'overloading in php
	 *  
	 * @param string $nome
	 * @param mixed $argomento
	 */
	public function __call($nome,$argomento){
		
		/**
		 * Overload della funzione post
		 */
		if(strcmp($nome,'post') == 0) { 
			//TODO: Da modificare
			//FIXME: Dovrei controllare che tutti gli oggetti siano EEntity
			if(is_array($argomento[0]) && $argomento[0][0] instanceof EEntity){
				$this->postArr($argomento[0]);
			} else if ($argomento[0] instanceof EEntity){
				$this->postEnt($argomento[0],$argomento[1]);
			}else{
				$this->postVar($argomento[0]);
			}
			
			return;
		}
		
	}
	/**
	 * postVar
	 * 
	 * Stampa una varibile qualsiasi
	 * 
	 * @param mixed $var
	 */
	private function postVar($var){
		
		$result = json_encode($var);
		
		$this->assign('json',$result);
		$this->setPage('dato.tpl');
		$this->display();
		
	}
	/**
	 * postArr
	 * 
	 * @param array $entities
	 */
	//TODO: Aggiungere anche qui un check interface
	private function postArr($entities) {
	
		$result = ' [';
		$i = 0;
		
		foreach($entities as $e){
			if($i == 0){
				$result .= $e->jsonEncode();
			}else{
				$result .= ','.$e->jsonEncode();
			}
			$i++;
			
		}
		
		$result .= ']';
	
		$this->assign('json',$result);
		$this->setPage('dato.tpl');
		$this->display();
	}
	/**
	 * postEnt
	 * 
	 * @param EEntity $e
	 * @param string $nome
	 */
	private function postEnt(EEntity $e,$nome = 'Obj') {
		$this->assign('json', $e->jsonEncode());
		$this->setPage('dato.tpl');
		$this->display();
	}
	/**
	 * getEnt
	 * 
	 * @param string $dest_class
	 * @param string $json_name
	 * @return EEntity
	 * @throws ExceptionDati
	 */
	public function getEnt($dest_class,$json_name = 'json'){
		
		/**
		 * Esistenza e se implementa l'interfaccia giusta
		 */
		
		if(!class_exists($dest_class)){
			return false;
		}
		
		$class = new $dest_class();
		
		if(!($class instanceof JSONSerializable)){
			
			return false;
		}
		
		if(!isset($_REQUEST[$json_name])){
			
			return false;
		}
		
		
		$obj = json_decode($_REQUEST[$json_name]);
		
		//FIXME:Tira eccezioni occhio!
		$class->jsonDecode($obj);
		
		return $class;
		
	}
	/**
	 * get
	 * 
	 * Torna un oggetto/json grezzo
	 * 
	 * @param string $nome
	 * @return mixed
	 */
	public function get($nome) {
		
		if(!isset($_REQUEST[$nome])){
			return false;
		}
		
		return json_decode($_REQUEST[$nome]);
		
	}
	
	
}

